﻿unit UPasswd;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, UNI, System.IniFiles, cxGraphics,
  cxControls, cxLookAndFeels, cxLookAndFeelPainters, cxContainer, cxEdit,
  dxSkinsCore, dxSkinsdxBarPainter, cxLabel, dxBar, cxBarEditItem, cxClasses,
  cxTextEdit, cxMaskEdit, cxDropDownEdit, cxLookupEdit, cxDBLookupEdit,
  cxDBLookupComboBox, cxGroupBox, dxSkinOffice2007Blue, Data.DB, DBAccess,
  MemDS, cxLocalization, JvExControls, JvAnimatedImage, JvGIFCtrl;

type
  TFPasswd = class(TForm)
    Group1: TcxGroupBox;
    lblUser: TcxLabel;
    edtName: TcxLookupComboBox;
    lblPasswd: TcxLabel;
    edtPasswd: TcxTextEdit;
    lblOrg: TcxLabel;
    edtOrg: TcxLookupComboBox;
    dxbrmngr1: TdxBarManager;
    Bardxbrmngr1Bar1: TdxBar;
    btnCancel: TdxBarLargeButton;
    btnOk: TdxBarLargeButton;
    chk1: TcxBarEditItem;
    QueryUsers: TUniQuery;
    dsUsers: TUniDataSource;
    dsOrg: TUniDataSource;
    QueryOrg: TUniQuery;
    lblLang: TcxLabel;
    edtLang: TcxComboBox;
    cxlclzr1: TcxLocalizer;
    Query1: TUniQuery;
    procedure btnCancelClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure btnOkClick(Sender: TObject);
    procedure edtLangPropertiesEditValueChanged(Sender: TObject);
    procedure edtOrgPropertiesEditValueChanged(Sender: TObject);
    procedure edtNamePropertiesEditValueChanged(Sender: TObject);
    procedure edtNamePropertiesChange(Sender: TObject);
    procedure edtPasswdKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure edtPasswdKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    Counter: SmallInt;
    procedure EnableSave;
    function GetRoleId(id_locate: Integer = 0): Integer;
    function GetUserName(id_locate: Integer = 0): string;
    procedure LangPasswd;
    { Private declarations }
  public
    INI: TIniFile;
    DefaulPath: string;
    Lang: Integer;
    ID_USER: Integer;
    ID_ORG: Integer;
    ID_ROLE: Integer;
    ID_COUNTRY, ID_REGION, ID_CITY: Integer;

    ///	<summary>
    ///	  Отобразить пользователей в выпадающем меню
    ///	</summary>
    procedure ShowUsers;
    { Public declarations }
  end;

var
  FPasswd: TFPasswd;

implementation

{$R *.dfm}

uses USplash, UDataModule1, UOsn, UDialogMy;

procedure TFPasswd.btnCancelClick(Sender: TObject);
begin
  Application.Terminate;
end;

procedure TFPasswd.btnOkClick(Sender: TObject);
var
  s: string;
begin
  try
    with DM1.QueryGlobalUser do
    begin
      FSplash.Show();
      FSplash.Update;
      Close;
      SQL.Text :=
        'select пароль, id from пользователи.пользователи where пароль=md5(''' +
        edtPasswd.Text + ''') and id=' + inttostr(edtName.EditValue);
      Open;
      FSplash.Update;
      if RecordCount > 0 then
      begin
        ID_USER := edtName.EditValue;
        ID_ORG := edtOrg.EditValue;
        ID_ROLE := GetRoleId(FieldByName('id').AsInteger);
        Close;
        SQL.Text :=
          'select "код_страны", "код_региона" , "код_города" from "организация"."организации" where id='
          + inttostr(ID_ORG);
        FSplash.Update;
        Open;
        FSplash.Update;
        ID_COUNTRY := FieldByName('код_страны').AsInteger;
        ID_REGION := FieldByName('код_региона').AsInteger;
        ID_CITY := FieldByName('код_города').AsInteger;
        FSplash.Close;
        FPasswd.Close;
        FOsn.Enabled := true;
        s := 'Trade 2012. ';
        cxlclzr1.LoadFromFile(ExtractFileDir(Application.ExeName) +
          '.\ini\LanguagesUnicode.ini');
        cxlclzr1.Active := true;
        case edtLang.ItemIndex of
          0:
            begin
              s := s + 'Пользователь: ' + edtName.Text + '. Версия: ';
              cxlclzr1.Locale := 1049;
            end;
          1:
            begin
              s := s + 'User: ' + edtName.Text + '. Version: ';
            end;
          2:
            begin
              s := s + 'El usuario: ' + edtName.Text + '. La versión: ';
              cxlclzr1.Locale := 1034;
            end;
        end;
        s := s + '1.0.1';
        FOsn.Caption := s;
        INI.WriteInteger('Settings', 'org', edtOrg.EditValue);
        INI.WriteInteger('Settings', 'login', edtName.EditValue);
        INI.WriteInteger('Settings', 'lang', edtLang.ItemIndex);
        { проверяем клиентов для сообщений }
      end
      else
      begin
        FSplash.Close;
        edtPasswd.SelectAll;
        Counter := Counter + 1;
        s := 'Не правильный пароль. Осталось попыток - ' + inttostr(4 - Counter)
          + '. Попробуете снова?';
        if (Counter = 4) or (Application.MessageBox(PChar(s), 'Ошибка',
          MB_YESNO + MB_ICONERROR) = mrNo) then
        begin
          Application.Terminate
        end;
      end;
    end;
  except
    Application.Terminate;
  end;
  edtPasswd.SetFocus;
end;

procedure TFPasswd.edtLangPropertiesEditValueChanged(Sender: TObject);
begin
  LangPasswd;
end;

procedure TFPasswd.edtNamePropertiesChange(Sender: TObject);
begin
  EnableSave;
end;

procedure TFPasswd.edtNamePropertiesEditValueChanged(Sender: TObject);
begin
  EnableSave;
end;

procedure TFPasswd.edtOrgPropertiesEditValueChanged(Sender: TObject);
begin
  ShowUsers;
  EnableSave;
end;

procedure TFPasswd.edtPasswdKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (btnOk.Enabled = true) and (Key = VK_RETURN) then
    btnOkClick(Sender);
end;

procedure TFPasswd.edtPasswdKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  EnableSave;
end;

procedure TFPasswd.EnableSave;
begin
  if (edtName.Text <> '') and (edtPasswd.Text <> '') and (edtOrg.Text <> '')
  then
    btnOk.Enabled := true
  else
    btnOk.Enabled := false;
end;

procedure TFPasswd.FormShow(Sender: TObject);
begin
  FOsn.Show;
  FOsn.Enabled := false;
  DefaulPath := ExtractFileDir(Application.ExeName);
  try
    INI := TIniFile.Create(DefaulPath + '.\ini\set.ini');
    edtOrg.EditValue := INI.ReadInteger('Settings', 'org', 0);
    edtName.EditValue := INI.ReadInteger('Settings', 'login', 0);
    edtLang.ItemIndex := INI.ReadInteger('Settings', 'lang', 0);
    if INI.ReadInteger('Settings', 'screen', 0) = 1 then
      FOsn.WindowState := wsMaximized
    else
      FOsn.WindowState := wsNormal;
  except
  end;
  DM1.db1.Connected := true;
  FSplash.Show();
  FSplash.Update;
  { проверяем не закрыта -ли БД }
  with Query1 do
  begin
    Close;
    SQL.Text := 'select * from "бд"."настройки"';
    Open;
    if FieldByName('закрыта').AsBoolean = true then
    begin
      case Lang of
        0:
          ErrorDialog('База данных закрыта на техническое обслуживание. ', '',
            ' Дата/Время окончания работ: ' + FieldByName('дата_открытия')
            .AsString);
        1:
          ErrorDialog('Database is closed for maintenance.', '',
            'Date/Time of end of works: ' + FieldByName('дата_открытия')
            .AsString);
        2:
          ErrorDialog('Base de datos es cerrada al mantenimiento técnico.', '',
            'La Fecha/tiempo de la terminación de los trabajos: ' +
            FieldByName('дата_открытия').AsString);
      end;
      Application.Terminate;
    end;
    { версия }
    if FieldByName('версия_базы').AsString <> '1.1' then
    begin
      case Lang of
        0:
          ErrorDialog('Версия программы и базы данных не совпадают. ', '',
            'Обновите приложение.');
        1:
          ErrorDialog
            ('Version of the program and the database are not the same. ', '',
            'Update the application.');
        2:
          ErrorDialog('Versión del programa y la base de datos no coincide.',
            '', 'Renueven la aplicación.');
      end;
      Application.Terminate;
    end;
  end;
  QueryOrg.Close;
  QueryOrg.Open;
  FSplash.Close;
  edtPasswd.SetFocus;
end;

function TFPasswd.GetRoleId(id_locate: Integer = 0): Integer;
var
  Query1: TUniQuery;
begin
  Query1 := TUniQuery.Create(nil);
  Query1.Connection := DM1.db1;
  with Query1 do
  begin
    Close;
    SQL.Text := 'select код_роли from пользователи.пользователи where id=' +
      inttostr(id_locate);
    Open;
    Result := Fields[0].AsInteger;
  end;
end;

function TFPasswd.GetUserName(id_locate: Integer = 0): string;
var
  Query1: TUniQuery;
begin
  Query1 := TUniQuery.Create(nil);
  Query1.Connection := DM1.db1;
  with Query1 do
  begin
    Close;
    SQL.Text := 'select name from пользователи.пользователи where id=' +
      inttostr(id_locate);
    Open;
    Result := Fields[0].AsString;
  end;
end;

procedure TFPasswd.LangPasswd;
var
  a: array [0 .. 255] of Char;
  StrTblOfs: Integer;
begin
  { Получаем текущий язык системы и начало соответствующих строк в таблице }
  // case GetLanguage of
  // LANG_ENGLISH:
  // StrTblOfs := 0;
  // LANG_SPANISH:
  // StrTblOfs := 16;
  // LANG_SWEDISH:
  // StrTblOfs := 32;
  // else
  // StrTblOfs := 0;
  // end;
  Lang := edtLang.ItemIndex;
  case Lang of
    0:
      StrTblOfs := 0;
    1:
      StrTblOfs := 1000;
    2:
      StrTblOfs := 2000;
  end;
  { Загружаем и устанавливаем заголовок кнопки "Yes" в соответствии с языком }
  if LoadString(hInstance, StrTblOfs + 1, @a, sizeof(a)) <> 0 then
    lblOrg.Caption := StrPas(a);
  if LoadString(hInstance, StrTblOfs + 2, @a, sizeof(a)) <> 0 then
    lblUser.Caption := StrPas(a);
  if LoadString(hInstance, StrTblOfs + 3, @a, sizeof(a)) <> 0 then
    lblPasswd.Caption := StrPas(a);
  if LoadString(hInstance, StrTblOfs + 4, @a, sizeof(a)) <> 0 then
    lblLang.Caption := StrPas(a);
  if LoadString(hInstance, StrTblOfs + 5, @a, sizeof(a)) <> 0 then
    Group1.Caption := StrPas(a);
  if LoadString(hInstance, StrTblOfs + 6, @a, sizeof(a)) <> 0 then
    btnOk.Caption := StrPas(a);
  if LoadString(hInstance, StrTblOfs + 7, @a, sizeof(a)) <> 0 then
    btnCancel.Caption := StrPas(a);
  FOsn.LangOsn;
end;

procedure TFPasswd.ShowUsers;

begin
  with QueryUsers do
  begin
    Close;
    SQL.Text := 'select * from пользователи.пользователи ' +
      'where код_организации=' + inttostr(edtOrg.EditValue);
    Open;
  end;
end;

end.
